Skip to content

ci: automate signed catalog releases - #314

Merged
steipete merged 1 commit into
mainfrom
ci/release-pipeline
Oct 12, 2026
Merged

steipete merged 1 commit into
mainfrom
ci/release-pipeline

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Use the shared source release workflow at @v1 for the skill catalog. Add explicit release-version metadata and an SSH tag signer policy; require protected-main ancestry, dated changelog notes, and green exact-commit push CI. Publish verified commit source archives with checksums through Actions.

Replace the manual publication instructions with signed-tag releases and default no-publish dispatches. No npm package, version tag, or release is created by this change.

Validation: catalog frontmatter validation, actionlint, whitespace checks, and independent Codex review passed. The existing Linux, Windows, and native macOS CI remains the full source gate. A no-publish dispatch will exercise merged main.

@clawsweeper

clawsweeper Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Oct 12, 2026
@clawsweeper

clawsweeper Bot commented Oct 12, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge.

What this changes

This PR adds a shared signed-tag release workflow, release-version metadata, and instructions for automated source publication.

Example: Dispatch release.yml on main with version=0.5.0 and dry_run=true.

  • Before: The catalog has no release workflow for a no-publish rehearsal.
  • After: The workflow validates current protected main and verifies source artifacts without creating a tag or publishing a release.

Review scores

Measure Result What it means
Overall readiness 🧂 unranked krab (1/6) The integration is focused and useful, with one low-impact documentation defect; the new publication authority lacks required behavioral evidence.
Proof confidence 🧂 unranked krab (1/6) Real behavior proof is necessary before merge. See Before merge.
Patch quality 🦐 gold shrimp (3/6) Security review found an item that needs attention.

Product

Kind: Maintenance · Worth it: Yes · Fix scope: Complete
User problem: Release operators currently publish catalog source releases manually.
Reason: The maintainer-authored direction replaces manual publication with an existing shared release owner while preserving source-only distribution and independent CI.

Merge readiness

⛔ Blocked before merge - 4 items remain

Keep this maintainer-authored PR open: automating verified source releases has clear value, and current main still uses manual publication; correct the documented retry behavior.

Priority: P2
Reviewed head: dd4773d87c5f56e73528afb01f7a8264de2b3147

Before merge

  • Add real behavior proof - Authority-chain proof required: The new release caller grants publication authority to release-source.yml, but supplied validation does not exercise an allowed signed tag and the nearest forbidden signer through that owner, or show tag deletion/replacement invalidating queued or retried authorization before release creation, asset upload, or publication. The proposed main dry run bypasses signed-tag verification and skips publication. Provide redacted logs or terminal output from the production path or an authorized production-path harness; redact credentials and non-public endpoints. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Document matching-release retries accurately (P3) - When a release attempt is retried against an existing draft or public release, the selected shared workflow resumes a compatible draft or accepts a public release whose notes and assets match exactly. This statement instead says any existing GitHub Release is rejected, giving operators the wrong recovery contract. Describe exact-match retries and rejection of differing existing bytes.
  • Resolve security review attention item - The publication controls are present in source, but their final-effect authorization boundary remains unverified.
  • Resolve merge risk - Before merge, establish that deletion or replacement of the validated signed tag prevents queued or retried publication before release I/O.

Findings

  • [P3] Document matching-release retries accurately — docs/RELEASING.md:12-13

Tests

  • Missing end-to-end proof: Supply a production release-path trace showing an allowed signed tag passes and an unlisted signer plus a deleted or replaced validated tag cannot reach publication; a main dry run skips signature verification.
Agent review details

How this fits together

The catalog release caller sends version, signing, CI, and validation requirements to the shared release workflow, which produces verified source archives and publishes GitHub Releases.

flowchart TD
  A[Signed tag or manual dispatch] --> B[Catalog release caller]
  B --> C[Protected source and CI validation]
  C --> D[Catalog checks and source archives]
  D --> E[Independent artifact verification]
  E --> F[GitHub Release publication]
Loading

Technical review

Best possible solution:

Retain the thin shared-workflow caller with accurate retry documentation and verified publication authorization.

Do we have a high-confidence way to reproduce the issue?

The retry documentation mismatch is source-reproducible: the selected publisher explicitly resumes matching drafts and accepts identical public releases; no target code was executed.

Is this the best way to solve the issue?

A thin caller is appropriate because the shared workflow already owns signing checks, artifact verification, and publication; duplicating those controls locally would create another release owner.

Full review comments:

  • [P3] Document matching-release retries accurately — docs/RELEASING.md:12-13
    When a release attempt is retried against an existing draft or public release, the selected shared workflow resumes a compatible draft or accepts a public release whose notes and assets match exactly. This statement instead says any existing GitHub Release is rejected, giving operators the wrong recovery contract. Describe exact-match retries and rejection of differing existing bytes.
    Confidence: 0.99

Overall correctness: patch is correct
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 77b229e42b40.

Merge-risk options

Maintainer options:

  1. Hold for authorization evidence (recommended)
    Keep this PR open until the release owner supplies allowed-signer and forbidden-signer proof, including tag invalidation before publication.
  2. Separate rehearsal from publication
    Initially enable only no-publish dispatches and introduce release-write publication after the authorization boundary is demonstrated.

Provenance checked

Testing

Proof path: none.

Security

Needs attention: The publication controls are present in source, but their final-effect authorization boundary remains unverified.

Evidence

What I checked:

  • Introduced change and current-main boundary: The pinned introduction adds the release caller, signer policy, and version metadata, and replaces the manual publication instructions; these changes are absent from the fetched main revision. (.github/workflows/release.yml:30, dd4773d87c5f)
  • Applicable repository policy: Read the complete root AGENTS.md; no changed path has an additional ancestor policy, and .agents/maintainer-notes is absent. The patch uses canonical source files and does not restore vendored autoreview implementations. (AGENTS.md:7, dd4773d87c5f)
  • Executed dependency contract: The caller executes release-source.yml@v1 with release-write permission, affirmatively making this dependency's runtime and trust contract applicable. The inspected v1 tag resolves to this dependency commit; CONTRIBUTING.md requires failure-mode review for changed publication gates. (CONTRIBUTING.md:5, e24b91e43745)
  • Publication authority controls: The shared workflow verifies an SSH-signed tag against the frozen source policy, separates caller tests from write credentials, binds both verifier attestations, and rechecks the exact tag object before making a draft public. (.github/workflows/release-source.yml:1015, e24b91e43745)
  • Existing-release retry behavior: The publisher accepts an existing public release when notes and downloaded assets match exactly, and resumes a compatible draft without overwriting differing assets; it does not categorically reject existing releases. (.github/workflows/release-source.yml:995, e24b91e43745)
  • Discussion and supplied validation: The complete PR body reports frontmatter validation, actionlint, whitespace checks, and an earlier review, and describes the no-publish dispatch as future work; the discussion contains only bot acknowledgements, with no release-path output or media. (dd4773d87c5f)

Labels

Label changes:

  • add P2: This is a focused release-tooling improvement without an established urgent user-facing regression.
  • add merge-risk: 🚨 security-boundary: The new caller delegates contents-write authority to a workflow that converts signed-tag authorization into public release publication.
  • add rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp.
  • add status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Label justifications:

  • P2: This is a focused release-tooling improvement without an established urgent user-facing regression.
  • merge-risk: 🚨 security-boundary: The new caller delegates contents-write authority to a workflow that converts signed-tag authorization into public release publication.
  • rating: 🧂 unranked krab: Overall readiness is 🧂 unranked krab; proof is 🧂 unranked krab and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Add final-effect proof for an unlisted signer and show deletion or replacement of the validated tag blocks queued or retried publication before release I/O.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

Reviewed October 12, 2026, 12:14 AM ET / 04:14 UTC.

@steipete
steipete merged commit 96f2859 into main Oct 12, 2026
14 checks passed
@steipete
steipete deleted the ci/release-pipeline branch October 12, 2026 04:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant